OpenCV中Mat的建立,高维度Mat的建立,以及各维度下值的索引问题,详细解析!

您所在的位置:网站首页 opencv 数组赋值 OpenCV中Mat的建立,高维度Mat的建立,以及各维度下值的索引问题,详细解析!

OpenCV中Mat的建立,高维度Mat的建立,以及各维度下值的索引问题,详细解析!

2024-07-12 12:32| 来源: 网络整理| 查看: 265

你看完这篇文章之后,将学会以下知识: ① 二维、三维、四维等任意维度的Mat的常用建立方法;② 任意维度Mat中值的索引;③ 以及一些Mat常用的操作。 下面是对各维度矩阵的介绍:

  注意:下面的操作只是我常用的操作方法,不是唯一的方法,对于那些没有思路的同学,下面的内容希望起到抛砖引玉的效果。

  我以单通道的uchar类型的图片做例子

1. 二维Mat

  二维的Mat是我们最常使用的类型,它就和我们的图片直接对应

构造函数:Mat(int rows, int cols, int type, const Scalar& s); 变量声明:cv::Mat mat2D(100, 100, CV_8UC1, cv::Scalar(0));

  上述变量声明的代码,定义了一个100x100的Mat,它有一个通道,通道中的数据类型都是uchar,每一个对应位置的值都是0。

对于这种二维矩阵的索引,有多种方法:   第一种(效率不高)

uchar a = mat2D.at(i,j)

  第二种

uchar* a = mat2D.ptr(0);//指针指向mat2D的0行首地址 uchar a = mat2D.ptr(1)[5];//取出(1,5)中的值 2. 三维Mat

  三维Mat一般很少用,对于它的操作:

构造函数:Mat(int ndims, const int* sizes, int type); 变量声明: int size[3] = {100, 100, 100}; cv::Mat mat3D(3, size, CV_8UC1, cv::Scalar(0));

  上面变量声明的代码,声明了一个维度为3,大小为100x100x100的Mat。

对于三维Mat的索引:   第一种方法(效率不高)

uchar a = mat3D.at(4,5,6);//取出(4,5,6)中对应的值

  第二种方法

uchar* a = mat3D.ptr(0,0);//a指向前两维限定下的行首的地址 uchar a = mat3D.ptr(0,0)[4];//取出(0,0,4)中的值 3. 四维Mat int size[4] = {100, 100, 100, 100}; cv::Mat mat4D(4, size, CV_8UC1, cv::Scalar(0));

对于四维Mat的索引,不能使用at函数,因为不支持超过三维的Mat

uchar* a = mat3D.ptr(0,0,0)[4];//取出(0,0,0,4)中对应的值 4. 五维Mat int size[5] = {100, 100, 100, 100, 100}; cv::Mat mat5D(5, size, CV_8UC1, cv::Scalar(0));

  大于四维的Mat,既不能使用at,也不能使用ptr访问元素。下面介绍我常用的方法:这里我们可以使用Mat类中的data成员变量,它指向Mat数据区的首地址,对于Mat类型的数据,它们是按照线性方式存值的,我们知道首地址之后,就可以通过指针偏移的方式,去索引任意元素的值。 对于 100x100x100x100x100 的五维Mat,如果索引要 [a,b,c,d,e] 中的值,则可以使用下面的方式

uchar a = *(mat5D.data + a*100*100*100*100 + b*100*100*100 + c*100*100 + d*100 + e);

  如果你在Mat中存储的不是CV_8UC1,而是别的类型,比如是CV_32FC1,那么就不能直接使用data,因为它默认是uchar类型的指针,需要将它强转为float类型。代码如下:

float a = *((float*)mat5D.data + a*100*100*100*100 + b*100*100*100 + c*100*100 + d*100 + e);

对于更高维的情况,使用上面的五维的方法推广就行,当然上述所有的方法,都不是最好的或者是唯一的,只是我个人比较常用的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3